package plan;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Acoe {
	private String nome;
	private List<Integer> preconPos;
	private List<Integer> preconNeg;
	
	private List<Integer> efeitosPos;
	private List<Integer> efeitosNeg;
	
	private static Map<String, Integer> mapaAcoes = new HashMap<String, Integer>();
	private int numProposicoe = 1;
	
	public Acoe(){
		this.setPreconPos(new ArrayList<Integer>());
		this.setPreconNeg(new ArrayList<Integer>());
		this.setEfeitosPos(new ArrayList<Integer>());		
		this.setEfeitosNeg(new ArrayList<Integer>());
	}
	
	public List<Acoe> iniciarAcoesStrip(String nomeFile, List<Integer> estadoIni, 
			List<Integer> estadoMeta){		
		
		int cont = 0;		
		List<Acoe> lst = new ArrayList<Acoe>();		
		
		try {
			FileReader reader = new FileReader(nomeFile);
			BufferedReader buffReader = new BufferedReader(reader);
			String linha;			
			
			Acoe acoe = new Acoe();			
			while ((linha = buffReader.readLine()) != null) {
				if(linha.equals("")){
					//System.out.println("acoes finais");					
					linha = buffReader.readLine();//estado inicial
					//System.out.println("estado inicial: " + linha);
					addLista(linha, estadoIni, null);
					linha = buffReader.readLine();//estado final
					//System.out.println("estado final: " + linha);
					addLista(linha, estadoMeta, null);
					break;
				}				
				if(cont == 0){//nome acoe
					acoe.setNome(linha);
					cont ++;
				} else if( cont == 1 ){//precondicoes
					addLista(linha, acoe.getPreconPos(), acoe.getPreconNeg());
					cont ++;
				} else {//efeitos
					addLista(linha, acoe.getEfeitosPos(), acoe.getEfeitosNeg());
					lst.add(acoe);
					acoe = new Acoe();
					cont = 0;
				}
			}			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}		
		return lst;
	}
		
	private void addLista(String linha, List<Integer> positiva, List<Integer> negativa){
		String acoes[] = linha.split(";");		
		
		for(int i=0;i<acoes.length ;i++){
			//System.out.println(acoes[i].charAt(0));
			if(acoes[i].charAt(0) == '~'){
				//System.out.println("proposicoes negativa: " + acoes[i].substring(1));
				Integer valor = this.mapaAcoes.get(acoes[i].substring(1));
				if(valor == null){
					valor = new Integer(this.numProposicoe);
					//System.out.println("Proposicoe: "  + acoes[i].substring(1) + " valor: "  + valor );
					this.mapaAcoes.put(acoes[i].substring(1), valor);
					this.numProposicoe++;
				}
				negativa.add(valor);
			} else {
				Integer valor = this.mapaAcoes.get(acoes[i]);
				if(valor == null){
					valor = new Integer(this.numProposicoe);
					//System.out.println("Proposicoe: "  + acoes[i] + " valor: " + valor );
					this.mapaAcoes.put(acoes[i], valor);
					this.numProposicoe++;
				}
				positiva.add(valor);
			}
		}
		return;
	}
	
	public static void main(String args[]){
		List<Integer> estadoIni= new  ArrayList<Integer>();
		List<Integer> estadoFinal= new  ArrayList<Integer>();		
		Acoe a = new Acoe();
		List<Acoe> lst 
		 	= a.iniciarAcoesStrip("Blocks-Ground/blocks-4-0.strips", estadoIni, estadoFinal); 
		for(int i=0; i < lst.size();i++){
			System.out.println("NOME ACOE: " + lst.get(i).getNome());
			System.out.println("PRE POS: " + lst.get(i).getPreconPos());
			System.out.println("PRE NEG: " + lst.get(i).getPreconNeg());
			System.out.println("EFEITOS POS: " + lst.get(i).getEfeitosPos());
			System.out.println("EFEITOS NEG: " + lst.get(i).getEfeitosNeg());			
		}
		
		System.out.println("ESTADO INICIAL: " + estadoIni);
		System.out.println("ESTADO FINAL: " + estadoFinal);
		System.out.println("NUM ACOES: " + lst.size());
		
	}

	/**
	 * @param nome the nome to set
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}
	/**
	 * @return the nome
	 */
	public String getNome() {
		return nome;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return nome;
	}

	/**
	 * @param preconPos the preconPos to set
	 */
	public void setPreconPos(List<Integer> preconPos) {
		this.preconPos = preconPos;
	}

	/**
	 * @return the preconPos
	 */
	public List<Integer> getPreconPos() {
		return preconPos;
	}

	/**
	 * @param efeitosPos the efeitosPos to set
	 */
	public void setEfeitosPos(List<Integer> efeitosPos) {
		this.efeitosPos = efeitosPos;
	}

	/**
	 * @return the efeitosPos
	 */
	public List<Integer> getEfeitosPos() {
		return efeitosPos;
	}

	/**
	 * @param preconNeg the preconNeg to set
	 */
	public void setPreconNeg(List<Integer> preconNeg) {
		this.preconNeg = preconNeg;
	}

	/**
	 * @return the preconNeg
	 */
	public List<Integer> getPreconNeg() {
		return preconNeg;
	}

	/**
	 * @param efeitosNeg the efeitosNeg to set
	 */
	public void setEfeitosNeg(List<Integer> efeitosNeg) {
		this.efeitosNeg = efeitosNeg;
	}

	/**
	 * @return the efeitosNeg
	 */
	public List<Integer> getEfeitosNeg() {
		return efeitosNeg;
	}
	
	
}
